#!/bin/bash
#inotify + rsync 实现数据实时同步脚本

# 定制环境变量
USER="rsyncer"
PASS_FILE="/data/scrips/www_rsync.pwd"
REMOTE_HOST="10.0.0.13"
SRC="/data/www/"
REMOTE_DIR="dir1"
DEST="${USER}@${REMOTE_HOST}::${REMOTE_DIR}"
LOG_FILE="/data/scrips/www_rsync.log"
# 确保日志目录存在
mkdir -p "$(dirname "${LOG_FILE}")"
ubuntu_install_inotify() {
    # 更新包列表，确保能安装最新版本
    apt update > /dev/null
    # 检查并安装 inotify-tools
    if [ ! -f /usr/bin/inotifywait ]; then
        echo "正在安装 inotify-tools (Ubuntu)..."
        apt install inotify-tools -y > /dev/null
    fi
    # 检查并安装 rsync
    if [ ! -f /usr/bin/rsync ]; then
        echo "正在安装 rsync (Ubuntu)..."
        apt install rsync -y > /dev/null
    fi
}

centos_install_inotify() {
    # 检查并安装 inotify-tools
    if [ ! -f /usr/bin/inotifywait ]; then
        echo "正在安装 inotify-tools (CentOS)..."
        yum install inotify-tools -y > /dev/null
    fi
    # 检查并安装 rsync
    if [ ! -f /usr/bin/rsync ]; then
        echo "正在安装 rsync (CentOS)..."
        yum install rsync -y > /dev/null
    fi
}

install_inotify() {
    # 更健壮的操作系统检测方法
    if command -v apt &> /dev/null; then
        ubuntu_install_inotify
    elif command -v yum &> /dev/null; then
        centos_install_inotify
    else
        echo "错误：无法识别的操作系统，无法安装依赖。"
        exit 1
    fi
}

# 不间断监控指定目录，当有变化时调用 rsync 进行同步
rsync_file() {
    echo "开始监控目录: ${SRC}"
    # 使用 inotifywait 监控目录
    inotifywait -mrq \
        --exclude=".*\.swp" \
        --timefmt '%Y-%m-%d %H:%M:%S' \
        --format '%T %w %f' \
        -e create,delete,moved_to,close_write,attrib \
        "${SRC}" | while read -r TIMESTAMP DIR FILE; do

        # 拼接完整路径，并处理 DIR 末尾是否带 / 的情况
        FILEPATH="${DIR}/${FILE}"

        # 添加一个短暂的延迟，防止因频繁的小改动而触发大量 rsync
        sleep 1

        echo "检测到变化: ${FILEPATH}，正在同步..."

        # 执行 rsync 同步，并检查执行结果
        if rsync -az --delete --password-file="${PASS_FILE}" "${SRC}" "${DEST}"; then
            echo "At ${TIMESTAMP}, file ${FILEPATH} was backed up via rsync" >> "${LOG_FILE}"
        else
            echo "At ${TIMESTAMP}, backup of ${FILEPATH} FAILED!" >> "${LOG_FILE}"
            echo "同步失败，请检查日志或网络连接。"
        fi
    done
}

# 主函数
main() {
    install_inotify
    rsync_file
}

# 执行主函数
main